package ar.uba.fi.algo3.algoTank.model.escenarios;

import java.util.ArrayList;
import ar.uba.fi.algo3.algoTank.model.Objeto;
import ar.uba.fi.algo3.algoTank.model.Vector;
import ar.uba.fi.algo3.algoTank.model.formas.Figura;
import ar.uba.fi.algo3.algoTank.util.Constantes;
import ar.uba.fi.algo3.titiritero.Posicionable;

public class Escenario implements Posicionable {

	private static Escenario instancia = null;

	private int alto;

	private int ancho;

	private ArrayList<Objeto> listaObjetos;

	private Escenario(int alto, int ancho) {
		super();
		this.alto = alto;
		this.ancho = ancho;
		listaObjetos = new ArrayList<Objeto>();
	}

	public int getAlto() {
		return alto;
	}

	public int getAncho() {
		return ancho;
	}

	public static Escenario getInstancia() {
		if (instancia == null) {
			instancia = new Escenario(Constantes.ESCENARIO_ALTO, Constantes.ESCENARIO_ANCHO);
		}
		return instancia;
	}

	public ArrayList<Objeto> getListaObjetos() {
		return listaObjetos;
	}

	public void agregarObjeto(Objeto objeto) {
		listaObjetos.add(objeto);
	}

	public void quitarObjeto(Objeto objeto) {
		listaObjetos.remove(objeto);
	}

	public boolean estaEnLosLimitesDelEscenario(Objeto objeto) {

		return (estaEnLosLimitesDelEscenario(objeto.getForma()));
	}

	public boolean estaEnLosLimitesDelEscenario(Vector posicion) {

		return ((posicion.getCoordX() >= 0) && (posicion.getCoordX() <= ancho) && (posicion.getCoordY() >= 0) && (posicion.getCoordY() <= alto));
	}

	public boolean estaEnLosLimitesDelEscenario(Figura forma) {
		Vector tamanio = forma.getTamanio();
		Vector posicion = forma.getPosicion();
		float x = posicion.getCoordX() + tamanio.getCoordX();
		float y = posicion.getCoordY() + tamanio.getCoordY();
		return ((forma.getPosicion().getCoordX() >= 0) && (x <= ancho) && (forma.getPosicion().getCoordY() >= 0) && (y <= alto));
	}

	public boolean estaVacio() {

		return (listaObjetos.size() == 0);
	}

	public int getX() {
		return 0;
	}

	public int getY() {
		return 0;
	}

}
